package com.cyj.dream.admin.testdemo;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Description: 为了线程安全最直接的方式，就是每次调用都直接 new SimpleDateFormat。但这
 * 样的方式终究不是最好的，所以我们使用 ThreadLocal ，来优化这段代码。我们把 SimpleDateFormat ，
 * 放到 ThreadLocal 中进行使用，即不需要重复 new 对象，也避免了线程不安全问题
 * @BelongsProject: DreamChardonnay
 * @BelongsPackage: com.cyj.dream.admin.testdemo
 * @Author: ChenYongJia
 * @CreateTime: 2021-11-19 12:29
 * @Email: chen87647213@163.com
 * @Version: 1.0
 */
@Slf4j
public class ThreadLocalSimpleDateFormat {

    private static ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(
            () -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    /**
     * 使用ThreadLocal，每个线程都拥有自己的SimpleDateFormat对象副本。
     * <p>
     * https://www.cnblogs.com/yangyongjie/p/11017409.html
     *
     * @param args
     */
    public static void main(String[] args) {
        while (true) {
            new Thread(() -> {
                String dateStr = threadLocal.get().format(new Date());
                try {
                    Date parseDate = threadLocal.get().parse(dateStr);
                    String dateStrCheck = threadLocal.get().format(parseDate);
                    boolean equals = dateStr.equals(dateStrCheck);
                    if (!equals) {
                        log.info(equals + " " + dateStr + " " + dateStrCheck)
                        ;
                    } else {
                        log.info("" + equals);
                    }
                } catch (ParseException e) {
                    log.error(e.getMessage());
                }
            }).start();
        }
    }


}
